从 福利哥 导入 〇蓝图, 渲染模板, 请求, 重定向, 构造url, 序列化为json, 会话, 闪现, 万事通
从 福利哥 导入 生成密码哈希值, 检查密码哈希值
从 福利哥_邮箱 导入 〇邮件

从 问答 导入 邮箱, 数据库
从 问答.模型 导入 〇邮箱验证模型, 〇用户模型

从 .表单 导入 〇注册表单, 〇登录表单

导入 string
导入 随机数
导入 日时

蓝图 = 〇蓝图("用户", __名称__, url前缀='/用户')

@蓝图.路由('/登录', 方法々=['GET', 'POST'])
套路 登录():
    表单 = 〇登录表单()
    如果 表单.提交并验证通过():
        登录邮箱 = 表单.电子邮箱.数据
        密码 = 表单.密码.数据
        记录 = 〇用户模型.查询.筛选_依据(电子邮箱=登录邮箱).第一条()
        如果 记录 且 检查密码哈希值(记录.密码, 密码):
            会话["用户id"] = 记录.id
            返回 重定向('/')
        闪现('电子邮箱或密码错误')
    返回 渲染模板('登录.html', 表单=表单)

@蓝图.路由('/注册', 方法々=['GET', 'POST'])
套路 注册():
    表单 = 〇注册表单()
    如果 表单.提交并验证通过():
        用户名 = 表单.用户名.数据
        注册邮箱 = 表单.电子邮箱.数据
        验证码 = 表单.验证码.数据
        # 密码 = 表单.密码.数据   # 不安全
        密码哈希值 = 生成密码哈希值(表单.密码.数据)
        新用户 = 〇用户模型(用户名=用户名, 电子邮箱=注册邮箱, 密码=密码哈希值)
        数据库.会话.添加(新用户)
        数据库.会话.提交()
        返回 重定向(构造url('用户.登录'))
    返回 渲染模板('注册.html', 表单=表单)

@蓝图.路由('/验证码', 方法々=['POST'])
套路 发送验证码():
    # 接收地址 = 请求.args.get('邮箱')  # 适用于 GET 请求
    接收地址 = 请求.form.get('电子邮箱')
    所有字母数字 = string.ascii_letters + string.digits
    验证码 = ''.连接(随机数.取样(所有字母数字, 4))

    如果 接收地址:
        邮件 = 〇邮件("测试", 
            收件人=[接收地址],
            正文=f'你的注册验证码是 {验证码}'
        )
        试:
            邮箱.发送(邮件)
        捕 爻异常 为 异常:
            返回 序列化为json({
            "代码" : 400,
            "消息" : 表示(异常)
        })
        记录 = 〇邮箱验证模型.查询.筛选_依据(电子邮箱=接收地址).第一条()
        如果 记录:
            记录.验证码 = 验证码
            记录.创建时间 = 日时.〇日时.此刻()
            数据库.会话.提交()
        否则:
            记录 = 〇邮箱验证模型(电子邮箱=接收地址, 验证码=验证码)
            数据库.会话.添加(记录)
            数据库.会话.提交()
        打印(f'验证码为: {验证码}')
        返回 序列化为json({
            "代码" : 200
        })
    返回 序列化为json({
            "代码" : 400,
            "消息" : "请提供正确的邮箱地址"
        })

@蓝图.路由('/退出')
套路 退出():
    会话['用户id'] = 空
    # 会话.清空()
    # 删属性(万事通, '用户')
    返回 重定向('/')